Saltar a contenido

📘 Clase 07: Containerización Profesional con Docker y Compose

  • :material-bookmark: Curso: Curso 4: Taller Práctico & Proyecto Final Integrador (CLASE 07)
  • :material-signal-cellular-outline: Nivel: Nivel 4 - Integrador
  • :material-lightbulb-on: Metáfora Central: «El Contenedor de Carga Estandarizado (Reproducibilidad Total)»
  • :material-laptop: Wisrovi Studio (Local): 🚀 Abrir Reto👨‍🏫 Modo Tutor
  • :material-file-pdf-box: Manual PDF Oficial: Descargar clase-07-docker-y-compose.pdf

Open In Colab Abrir en Studio Local Ver en GitHub


1. 💡 Fundamentación Teórica y Modelo Mental

Empaquetado inmutable y orquestación multi-servicio para producción: 1. Dockerfile Multi-Stage: Reducción drástica del tamaño de la imagen final y seguridad non-root. 2. Docker Compose: Orquestación coordinada de backend (FastAPI), frontend (Streamlit) y base de datos (Postgres). 3. Healthchecks & Variables de Entorno: Configuración estandarizada vía .env.

🌟 Modelo Mental de la Sesión: «El Contenedor de Carga Estandarizado (Reproducibilidad Total)»

En esta sesión anclamos el aprendizaje en la metáfora del mundo real para visualizar cómo fluyen las estructuras de datos y el flujo de ejecución en la memoria.


2. 🗺️ Arquitectura de Ejecución y Diagrama de Flujo

flowchart TD
    subgraph Compose["🐳 Docker Compose Orchestrator"]
        B["⚡ Backend (FastAPI :8000)"]
        F["📊 Frontend (Streamlit :8501)"]
        D["🐘 Base de Datos (Postgres :5432)"]
        F --> B
        B --> D
    end
    style Compose fill:#1e293b,color:#ffffff,stroke:#3b82f6,stroke-width:2px
    style B fill:#0f766e,color:#ffffff,stroke:#2dd4bf,stroke-width:2px
    style F fill:#d97706,color:#ffffff,stroke:#fbbf24,stroke-width:2px
    style D fill:#1e3a8a,color:#ffffff,stroke:#60a5fa,stroke-width:2px

3. 💻 Código de Implementación Práctica

```python def generar_compose_yaml(servicios: list[str]) -> str: return f"""version: '3.8'

services: """ + "\n ".join(f"{s}:\n image: wisrovi/{s}:latest" for s in servicios)

print(generar_compose_yaml(["fastapi_app", "streamlit_ui"])) ```

```python servicios = ["backend", "frontend", "db"]

print("Servicios listos para compose:", servicios) ```


4. 🛡️ Buenas Prácticas PEP 8: Antipatrones vs Código Pythonic

⚠️ Cuidado con los Antipatrones

FROM ubuntu:latest  # ❌ Imagen pesada y lenta de descargar
FROM python:3.11-slim  # ✅ Ligera (~150 MB) y rápida

5. 🏋️ Desafío Práctico de la Clase

🎯 Enunciado del Reto

Crea una función generar_dockerfile_python(version: str = '3.11-slim', port: int = 8000) -> str que retorne una cadena con un Dockerfile estándar conteniendo las directivas: FROM python:{version}, WORKDIR /app, EXPOSE {port} y CMD ["uvicorn", "main:app"].

⚡ Resolución Híbrida en 1 Clic (Local + Web)

Si tienes ejecutando wisrovi ui en tu terminal local, puedes 🚀 Abrir este Reto directamente en tu Studio Local (127.0.0.1:8501) para escribir tu código con auto-formateo AST, inspeccionar variables en el Heap/Stack y evaluarlo con pruebas en tiempo real.

```python def generar_dockerfile_python(version: str = "3.11-slim", port: int = 8000) -> str:

✍️ Genera el contenido del Dockerfile

return f"""FROM python:{version}

WORKDIR /app COPY . /app EXPOSE {port} CMD ["uvicorn", "main:app"]"""

```
💡 Pista Socrática 1

💡 Pista 1: Incluye FROM python:{version} y WORKDIR /app.

💡 Pista Socrática 2

💡 Pista 2: Incluye EXPOSE {port} con el puerto parametrizado.

💡 Pista Socrática 3

💡 Pista 3: Retorna la cadena completa formateada.

Para resolver este ejercicio en tu entorno: 1. Abre el archivo ejercicios/reto.py de esta clase en Visual Studio Code o utiliza wisrovi ui / wisrovi tutor. 2. Implementa tu solución cumpliendo los requisitos y contratos de tipado. 3. Valida tus resultados ejecutando las pruebas unitarias:

pytest tests/curso_04/test_clase_07_docker_y_compose.py


6. 📚 Fuentes y Bibliografía Recomendada